﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
using Tilver.WCF.Contracts;
using Tilver.WCF.Services;

namespace Tilver.WCF.Hosting
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             * WCF服务需要依存一个运行着的进程（宿主），服务寄宿就是为服务指定一个宿主的过程。WCF是一个基于消息的通信框架，采用基于终结点（Endpoint）的通信手段。
             * 终结点由地址（Address）、绑定（Binding）和契约（Contract）三要素组成，如图3所示。由于三要素应为首字母分别为ABC，所以就有了易于记忆的公式：Endpoint = ABC。
             * 地址（Address）：地址决定了服务的位置，解决了服务寻址的问题；
             * 绑定（Binding）：绑定实现了通信的所有细节，包括网络传输、消息编码，以及其他为实现某种功能（比如安全、可靠传输、事务等）对消息进行的相应处理。WCF中具有一系列的系统定义绑定，比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等；
             * 契约（Contract）：契约是对服务操作的抽象，也是对消息交换模式以及消息结构的定义。
             */
            //无配置文件
            /*
            using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
            {
                host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://127.0.0.1:9000/calculatorservice");
                if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
                {
                    //WCF服务的描述通过元数据（Metadata）的形式发布出来
                    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                    behavior.HttpGetEnabled = true;
                    behavior.HttpGetUrl = new Uri("http://127.0.0.1:9000/calculatorservice/metadata");
                    host.Description.Behaviors.Add(behavior);
                }
                host.Opened += new EventHandler(host_Opened);
                host.Open();
                Console.Read();
            }
            */
            //有配置文件
            using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
            {
                host.Opened += new EventHandler(host_Opened);
                host.Open();
                Console.Read();
            }
        }

        static void host_Opened(object sender, EventArgs e)
        {
            Console.WriteLine("CalculaorService已经启动，按任意键终止服务！");
        }
    }
}
